#ifndef WIDGET_HPP
#define WIDGET_HPP

#include <QWidget>
#include <QLineEdit>
#include <QPushButton>
#include <QFileDialog>
#include <QMessageBox>
#include <QLabel>
#include <QPixmap>
#include <QFont>
#include <QPalette>
#include <QSettings>
#include <QMouseEvent>
#include <QProcess>
#include <QProgressBar>
#include <QTimer>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QDragMoveEvent>
#include <QDragLeaveEvent>
#include <QMimeData>
#include <QUrl>
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QDialog>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFormLayout>
#include <QTextEdit>
#include <QStandardPaths>
#include <QDir>

class Widget : public QWidget {
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void onBrowseClicked();    // 浏览文件按钮点击事件
#ifdef Q_OS_LINUX
    void onIconBrowseClicked(); // 图标浏览按钮点击事件（仅Linux）
    void onAppImagePackagingFinished(bool success, const QString& outputPath, const QString& errorMsg); // AppImage打包完成处理
#endif
    void onPackageClicked();   // 打包按钮点击事件
    void onOutputBrowseClicked();    // 新增输出路径浏览槽函数
    void showSettings();       // 显示设置对话框
    void showAbout();          // 显示关于对话框
private:
    QMenuBar *menuBar;         // 菜单栏
    QAction *settingsAction;   // 设置动作
    QAction *aboutAction;      // 关于动作
    
    QLabel *titleLabel;        // 艺术字标题
    QLabel *iconLabel;         // 图标标签
    QLineEdit *nameEdit;       // 软件名输入框
    QLineEdit *versionEdit;    // 版本号输入框
    QLineEdit *pathEdit;       // 程序路径输入框
    QPushButton *browseButton; // 浏览按钮
#ifdef Q_OS_LINUX
    QLineEdit *iconEdit;       // 程序图标输入框（仅Linux）
    QPushButton *iconBrowseButton; // 图标浏览按钮（仅Linux）
#endif
    QPushButton *packageButton;// 打包按钮
    QLineEdit *outputPathEdit;       // 新增输出路径输入框
    QPushButton *outputBrowseButton; // 新增输出路径浏览按钮
    QProgressBar *progressBar;     // 进度条
    QLabel *statusLabel;           // 状态标签
    QSettings* settings;

    void loadSettings();  // 加载配置
    void saveSettings();  // 保存配置

    void showError(const QString &message); // 错误弹窗
    void setupUI();             // 界面初始化
    void setupStyles();         // 样式设置
    void openIssFile(const QString& filePath);
    // 删除强制路径检查函数声明
    void runWinDeployQt();
    QString getValidWindeployqtPath(QWidget* p);
    bool runGuiProgram(const QString &fullPath);
    void test();
    void showFancySuccessDialog(QWidget* parent = nullptr);
    bool isWinDeployQtExist(const QString &path);
    bool isQtApplication(const QString &exePath); // 检测是否是Qt程序
    void runInnoSetupCompiler(const QString &issPath); // 运行Inno Setup编译器
    void processAutoPackaging(); // 一条龙打包服务
    void updatePackageButtonState(const QString &text, bool enabled = false); // 更新按钮状态
    void resetPackageButtonState(); // 重置按钮状态
    void compileInstaller(const QString &issPath); // 编译安装程序
    void startCompilation(const QString &isccPath, const QString &issPath); // 开始编译
    void showProgressBar(); // 显示进度条
    void hideProgressBar(); // 隐藏进度条

#ifdef Q_OS_LINUX
    void processUbuntuPackaging(); // Ubuntu版本打包逻辑
#else  
    void processWindowsPackaging(); // Windows版本打包逻辑
#endif
    
    // 新增的私有方法
    void setupMenuBar();       // 设置菜单栏
    QString autoDetectWinDeployQt(); // 自动检测windeployqt路径
    QString autoDetectInnoSetup(); // 自动检测Inno Setup编译器路径
    void createStyledDialog(QDialog *dialog, const QString &title); // 创建统一风格的对话框
    
#ifdef Q_OS_LINUX
    QString getValidLinuxdeployqtPath(); // 获取有效的linuxdeployqt路径
    QString getValidAppimagetoolPath(); // 获取有效的appimagetool路径
    void downloadAppimagetool(); // 异步下载appimagetool
    bool isAppimagetoolInstalled(); // 检查appimagetool是否已安装
#endif
protected:
    bool eventFilter(QObject *obj, QEvent *event) override;
    
    // 拖拽事件处理
    void dragEnterEvent(QDragEnterEvent *event) override;
    void dropEvent(QDropEvent *event) override;
    void dragMoveEvent(QDragMoveEvent *event) override;
    void dragLeaveEvent(QDragLeaveEvent *event) override;
    bool isNameEditClicked;
    bool isVersionEditClicked;
    bool isPathEditClicked;
    bool isOutputPathEditClicked;
};

#endif // WIDGET_HPP
